﻿using QuanLyGiaoVuDAL.ADOWrapper;
using QuanLyGiaoVuDAL.DTO;
using QuanLyGiaoVuDAL.Mapper;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace QuanLyGiaoVuDAL.Repositories.DatabaseRepositories
{
    public class LichThiRepository : ILichThiRepository
    {

        public LichThiDTO GetLichThiById(Guid id)
        {
            var maLichThiParameter = DBParameterFactory.Create("MaLichThi", id);
            var maLopMonHocParameter = DBParameterFactory.Create("MaLopMonHoc", SqlDbType.UniqueIdentifier, DBNull.Value);
            var maHocKyParameter = DBParameterFactory.Create("MaHocKy", SqlDbType.UniqueIdentifier, DBNull.Value);
            var hinhThucThiParameter = DBParameterFactory.Create("HinhThucThi", SqlDbType.SmallInt, DBNull.Value);
            var maGiangVienParameter = DBParameterFactory.Create("MaGiangVien", SqlDbType.UniqueIdentifier, DBNull.Value);
            var dbResult = StoreProcedureExecutor.ExecuteStoreProcedure("[dbo].[usp_LICHTHISelect]", maLichThiParameter, maLopMonHocParameter, maHocKyParameter, maGiangVienParameter, hinhThucThiParameter);
            var dataRow = dbResult.Tables[0].Rows[0];
            return dataRow.ToLichThiDTO();
        }

        public IEnumerable<LichThiDTO> GetAllLichThi(Guid? maHocKy, Guid? maGiangVien, int? hinhThucThi, Guid? maLopMonHoc)
        {
            List<LichThiDTO> lichThiList = new List<LichThiDTO>();
            var maLichThiParameter = DBParameterFactory.Create("MaLichThi", SqlDbType.UniqueIdentifier, DBNull.Value);
            var maLopMonHocParameter = maLopMonHoc != null ? DBParameterFactory.Create("MaLopMonHoc", SqlDbType.UniqueIdentifier, maLopMonHoc) : DBParameterFactory.Create("MaLopMonHoc", SqlDbType.UniqueIdentifier, DBNull.Value);
            var giangVienIdParameter = maGiangVien != null ? DBParameterFactory.Create("MaGiangVien", maGiangVien) : DBParameterFactory.Create("MaGiangVien", SqlDbType.UniqueIdentifier, DBNull.Value);
            var maHocKyParameter = maHocKy != null ? DBParameterFactory.Create("MaHocKy", maHocKy) : DBParameterFactory.Create("MaHocKy", SqlDbType.UniqueIdentifier, DBNull.Value);
            var hinhThucThiParameter = hinhThucThi != null ? DBParameterFactory.Create("HinhThucThi", hinhThucThi) : DBParameterFactory.Create("HinhThucThi", SqlDbType.SmallInt, DBNull.Value);
            var dbResult = StoreProcedureExecutor.ExecuteStoreProcedure("[dbo].[usp_LICHTHISelect]", maLopMonHocParameter, giangVienIdParameter, maHocKyParameter, hinhThucThiParameter);
            var lichThiTable = dbResult.Tables[0].Rows;
            foreach (DataRow dataRow in lichThiTable)
            {
                lichThiList.Add(dataRow.ToLichThiDTO());
            }
            return lichThiList.AsEnumerable();
        }

        public LichThiDTO InsertLichThi(LichThiDTO lichThiDTO)
        {
            var dbResult = StoreProcedureExecutor.ExecuteStoreProcedure("[dbo].[usp_LICHTHIInsert]", GetParameterArray(lichThiDTO));
            var dataRow = dbResult.Tables[0].Rows[0];
            return dataRow.ToLichThiDTO();
        }

        private SqlParameter[] GetParameterArray(LichThiDTO lichThiDTO)
        {
            SqlParameter[] parameters = new SqlParameter[7];
            parameters[0] = DBParameterFactory.Create("MaLichThi", lichThiDTO.MaLichThi);
            parameters[1] = DBParameterFactory.Create("MaLopMonHoc", lichThiDTO.MaLopMonHoc);
            parameters[2] = DBParameterFactory.Create("NgayGio", lichThiDTO.NgayGio);
            parameters[3] = DBParameterFactory.Create("ThoiGianLamBai", lichThiDTO.ThoiGianLamBai);
            parameters[4] = lichThiDTO.MaPhong != null ? DBParameterFactory.Create("MaPhong", lichThiDTO.MaPhong) : DBParameterFactory.Create("MaPhong", SqlDbType.UniqueIdentifier, DBNull.Value);
            parameters[5] = DBParameterFactory.Create("HinhThucThi", lichThiDTO.HinhThucThi);
            parameters[6] = lichThiDTO.GhiChu != null ? DBParameterFactory.Create("GhiChu", lichThiDTO.GhiChu) : DBParameterFactory.Create("GhiChu", SqlDbType.NVarChar, DBNull.Value);
            return parameters;
        }

        public LichThiDTO UpdateLichThi(LichThiDTO lichThiDTO)
        {
            var dbResult = StoreProcedureExecutor.ExecuteStoreProcedure("[dbo].[usp_LICHTHIUpdate]", GetParameterArray(lichThiDTO));
            var dataRow = dbResult.Tables[0].Rows[0];
            return dataRow.ToLichThiDTO();
        }

        public bool DeleteLichThi(Guid id)
        {
            SqlParameter lichThiIdParam = DBParameterFactory.Create("MaLichThi", id);
            return StoreProcedureExecutor.ExecuteNonQueryStoredProcedure("[dbo].[usp_LICHTHIDelete]", lichThiIdParam);
        }
    }
}
